#!/usr/bin/env python
#coding=utf-8
# author:wade
# contact: 317909531@qq.com
# datetime:2020/5/3 10:12

"""
文件说明： 从数据库中取出链接，开始爬取帖子内容
"""
import os,django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "shareAPI2020TB.settings")# project_name 项目名称
django.setup()
import logging
server_logger = logging.getLogger("server")
import time
from django.contrib.admin.utils import unquote
from requests.adapters import HTTPAdapter

import re
import requests
from lxml import etree
from tbitem import models

def findSameWordInTwoWords(seq1,seq2):  #抓取两个段落的最大化交集
    # seq1 = "重要提醒:爱诗普霖净水器怎么样,质量差不差是真的吗?"   #标题
    # seq2 = "老用户使用后对爱诗普霖净水器点评吐槽："         #对比句
    matchStr = ''
    for i in range(2,len(seq1)):   #根据标题的总长度，然后设置划窗长度，最小设置窗口是2，最大是总长度
        # i表示划窗长度，若果是2
        for s in range(len(seq1)-i):
            # print(f"{s}:{s+i}")
            setStr = seq1[s:s+i]
            # print(seq1[s:s+i])  #这个是截取到的字符串，开始匹配第二个字符串，如果在里边，就覆盖，直至最大的字符串覆盖进去
            if setStr.lower() in seq2.lower():  #如果存在就存进match字符串
                matchStr = setStr
        # print('-------------------')
    print(f"已经为您匹配出最大重复句子--{matchStr}")
    return matchStr

def getOneLink():
    #从数据库中取出未解析的链接
    querySet = models.BBsLinks.objects.filter(status=1).all()
    return querySet

#解析stick链接
def get_redirect_url(jump_url):

    server_logger.error(f"step2-----'进入get_redirect_url函数{jump_url}'")
    headers = {
        "upgrade-insecure-requests": "1",
        "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36",
        "sec-fetch-mode": "navigate",
        "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
        "sec-fetch-site": "none",
        "accept-encoding": "gzip, deflate, br",
        "accept-language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,ja-JP;q=0.6,ja;q=0.5",
    }
    s = requests.Session()
    s.mount('http://', HTTPAdapter(max_retries=3))  # 重试3次
    s.mount('https://', HTTPAdapter(max_retries=3))
    res = ''
    # logging.error(f'开始跳转获得真实链接')
    try:
        res = s.get(url=jump_url, headers=headers, timeout=3).text
    except requests.exceptions.RequestException as e:
        logging.error('淘宝跳转连接request请求失败')
    # 提取原始链接请求响应体中要302重定向的链接

    if re.findall("real_jump_address = \'(.*)\'", res) != []:  #如果不为空就是找到了
        # server_logger.error(f"step2-----'测试1{res}'")

        new_url = re.findall("real_jump_address = \'(.*)\'", res)[0].replace('amp;', '')
        # 必须加上referer
        headers['referer'] = jump_url
        # 这里需要禁止重定向
        resp = requests.get(url=new_url, headers=headers, allow_redirects=False)
        redirects_url = resp.headers.get('location')
        redirects_url = unquote(unquote(redirects_url))
        goods_idList = re.findall(r".*?id=(.*?)&", redirects_url)  #如果找不到，返回空列表，判断以下
        if goods_idList != []:
            goods_id = goods_idList[0]
            print(goods_id)
            print(resp.text)
            server_logger.error(f"step2-----'goods_id{goods_id}'")
            return goods_id
        else:
            logging.error('淘宝二次跳转真实页面中没有goods_id,这个链接是垃圾链接')
            return None
    else:
        logging.error('get_redirect_url没有找到 real_jump_address 这个字符串')
        return None


#单次 打开一个论坛内容页面，然后用etree的xpath取出主贴内容
def getHtml(linkNum):
    server_logger.error(f"step2----打开一个论坛内容页面，然后用etree的xpath取出主贴内容{linkNum}")
    qiboURL = f'http://bbs.8080.net/thread-{linkNum}-1-1.html'
    print(qiboURL)
    html = requests.get(qiboURL)
    # print(html.text)
    server_logger.error("step2-----抓到论坛帖子的页面")
    # 抓url
    panduan_sclik = 'https://s.click.taobao.com/'
    sclick_str = re.compile('([a-zA-z]+://s.click.taobao.com[^\s]*)["]')
    print(f"开始匹配网页内容")
    if panduan_sclik in html.text:  # 匹配到sclick
        print('----匹配到sclick')
        server_logger.error(f"step2-----getHtml 匹配到sclick")
        sclickurls = sclick_str.findall(html.text)  # 看看找到了几个，进行遍历，有的是店铺有的是id
        server_logger.error(f'step2 打印匹配出来的淘宝链接{sclickurls}')
        if sclickurls ==[]:
            # print("垃圾网页，返回空")
            server_logger.error(f"step2-----http://bbs.8080.net/thread-{linkNum}-1-1.html,存在sclick，但是没匹配出来，返回垃圾网页处理")
            return '', ''
        for sclickurl in sclickurls:
            print(sclickurl)
            # 辨识id，如果返回的是空的，就是店铺id链接，若有值，就是商品id，取到商品id就不用再分析店铺id了
            # server_logger.error(f'step2 准备进入get_redirect_url函数')
            itemid = get_redirect_url(sclickurl)
            # server_logger.error(f'结束--get_redirect_url函数itemid：{itemid}')
            if itemid != None:

                #判断id长度>10是商品id，如果小于等于10 判定为店铺id
                if len(itemid)<=10:
                    print('不是商品id，忽略')
                    return '', ''
                # 抓内容
                etreeHtml = etree.HTML(html.text)
                print('---------------开始抓取内容----------------')
                # etree抓发帖内容中url附近的字符串,抓a标签的内容，第二抓a标签的前后句
                # 1.抓帖子的内容

                block = etreeHtml.xpath(
                    '//*[@id="postlist"]/div/table/tr/td[@class="plc"]/div[@class="pct"]/div[@class="pcb"]/div[@class="t_fsz"]/table/tr/td[@class="t_f"]')
                # 打印提取到的结果

                t = etree.tostring(block[0], encoding="utf-8", pretty_print=True)
                # print('dd' * 10)
                # print(t.decode("utf-8"))
                pragraf = t.decode("utf-8")
                # 采用正则，抓tbk链接
                match = re.compile(r'(.*\n.*<a.*>.*)[\n]')
                abc = match.findall(pragraf)
                # print(abc)
                if abc:
                    return itemid,abc[0]  # 这个是抓到标签附近的词语，进行匹配的第二个词
                else:
                    print('该商品没有a标签链接链接')
                    return '',
            else:
                print('itemid是空的,喵口令配置或者网页改版导致')
                return '', ''
        # 商品id，拿到了就存储到发帖json里边
    else:
        print("垃圾网页，返回空")
        return '',''
        # 没有该链接的删除这一行

def step2():
    server_logger.error("step2-----Start")
    try:
        querySetList = getOneLink()
        if len(querySetList) ==0 :
            server_logger.error("step2----原始库存量为0,本轮休息")
        else:
            for linkITEM in querySetList:
                logging.warning('等待...')
                logging.warning('等待...')
                server_logger.error("step2-----等待...")

                linkNum = linkITEM.linkNum
                print(linkNum)
                tbid, contentWord = getHtml(linkNum)  # 抓取内容，然后需要再处理一下，正则出有链接前边的几句话
                # if tbid != '' and contentWord != '':   #判断网页中是否有id和同类关键词，如果都存在
                if tbid != '' and contentWord != '':    #修改：只判断是否有tbid，同类关键词不再使用
                    time.sleep(15)
                    print(f'-------------------拿到id和内容{tbid}--------------')
                    # keyword = findSameWordInTwoWords(linkITEM.title, contentWord)  # 这个是核心词

                    queryNum = models.BBSContent.objects.filter(contentLink_id=linkITEM.id).first()  # 是否已存在
                    if queryNum:  # 存在就不再操作他了
                        print('已经存在')
                        linkITEM.status = 2
                        linkITEM.save()
                    else:
                        models.BBSContent.objects.create(
                            contentLink=linkITEM,
                            tbid=tbid,
                            keyword='',
                            contentWord=linkITEM.title,
                        )
                        linkITEM.status = 2
                        linkITEM.save()

                else:
                    linkITEM.status = 3
                    linkITEM.save()
            server_logger.error("step2-----运行成功")
    except Exception as e:
        server_logger.error(f"step2-----step2例外出错---{e}")
if __name__ == '__main__':
    step2()  #负责爬取bbs的内容，抓到商品id和标题到数据库BBSContent
